package edu.nf.ch07.container;

import java.lang.reflect.Field;

/**
 * @author wangl
 * @date 2025/4/16
 * 属性注入处理器
 */
public class FieldInjectHandler {

    /**
     * 属性注入
     */
    public void handle(Object instance, ContainerFactory factory) {
        //遍历当前对象的所有私有属性，检查是否定义了@Inject注解
        for(Field field : instance.getClass().getDeclaredFields()) {
            if(field.isAnnotationPresent(Inject.class)) {
                //获取注解的value属性(也就是需要注入的对象名称)
                String name = field.getAnnotation(Inject.class).value();
                //从容器取出这个对象并注入到当前的instance实例中
                Object injectObj = factory.getBean(name);
                //赋值到Field字段中
                setValue(field, instance, injectObj);
            }
        }
    }

    /**
     * 注入
     * @param field 需要注入的字段
     * @param instance 被注入的对象
     * @param injectObj 注入的实例
     */
    private void setValue(Field field, Object instance, Object injectObj) {
        try {
            if(!field.canAccess(instance)) {
                field.setAccessible(true);
            }
            field.set(instance, injectObj);
        } catch (IllegalAccessException e) {
            throw new RuntimeException("Inject fail.",e);
        }
    }
}